package com.xxxtea.job;

import com.xxxtea.entity.User;
import com.xxxtea.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 用户解冻定时任务
 * 
 * 定时检查并自动解冻被锁定的用户账户，包括：
 * - 定期扫描被锁定的用户
 * - 自动解冻到期的锁定用户
 * - 用户状态管理
 * 
 * 使用Spring的@Scheduled注解实现定时执行
 * 使用@Slf4j注解提供日志功能
 * 
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Component
public class UserUnlockJob {
	
	/**
	 * 用户服务接口
	 * 用于执行用户相关的数据库操作
	 */
	@Resource
	private UserService userService;

	/**
	 * 用户解冻任务
	 * 
	 * 定时任务：每5分钟执行一次
	 * 功能：自动解冻被锁定的用户账户
	 * 
	 * 执行逻辑：
	 * 1. 查找所有被锁定的用户（状态为DISABLE）
	 * 2. 检查锁定时间是否已到期
	 * 3. 将到期的用户状态更新为ENABLE（启用）
	 * 
	 * 使用MyBatis-Plus的lambdaUpdate方法进行批量更新
	 */
	@Scheduled(fixedDelay = 5, timeUnit = TimeUnit.MINUTES)
	public void unlock() {
		log.info("开始执行解冻用户任务");
		
		// 执行批量更新操作：
		// 1. isNotNull(User::getLockTime) - 锁定时间不为空
		// 2. le(User::getLockTime, new Date()) - 锁定时间小于等于当前时间（已到期）
		// 3. eq(User::getStatus, User.Status.DISABLE) - 用户状态为禁用
		// 4. set(User::getStatus, User.Status.ENABLE) - 将状态设置为启用
		userService.lambdaUpdate().isNotNull(User::getLockTime)
				.le(User::getLockTime, new Date())
				.eq(User::getStatus, User.Status.DISABLE)
				.set(User::getStatus, User.Status.ENABLE)
				.update();
	}
}
